const { exec,spawn  } = require("child_process");
// exec_path 写入需要执行的exe命令，这里是"AlgorithmIntegrationPlatform.exe"
const path = require("path");
const iconv = require("iconv-lite");

/**
 * 终端执行命令
 * @param {*} command  
 * 关闭程序：taskkill /f /t /im 进程.exe
 * 开启程序：start 路径/进程.exe  或  taskkill /PID 进程ID /F
 * 查看进程：`tasklist /FI "IMAGENAME eq ${appname}
 * 查看所有进程：`tasklist`
 * @param {*} cb 
 */
let executeCommand = (command) => {
  return new Promise((resolve, reject) => {
    let platform = process.platform;
    let cmd = "";
    // 判断系统，然后调整命令
    switch (platform) {
      case "win32":
        // cmd = `tasklist`;
        break;
      case "darwin":
        // cmd = `ps -ax | grep ${query}`;
        break;
      case "linux":
        // cmd = `ps -A`;
        break;
      default:
        break;
    }
    exec(command, { encoding: "buffer" }, function (error, stdout, stderr) {
      // 将 stdout 从 GBK 编码转换为 UTF-8 编
      const stdout_ = iconv.decode(stdout, "GBK");
      const stderr_ = iconv.decode(stderr, "GBK");
      // console.log("stdout_", stdout_);
      // console.log("stderr_", stderr_);
      if (!error) {
        console.log(`命令 <${command}> 执行成功`);
        resolve(true); // 返回 true
      } else {
        console.log(`命令 <${command}> 执行失败：${stderr_}`);
        reject(false); // 返回 false，表示失败
      }
    });
  });
};
/**
 * 查询应用运行状态
 * @param {*} appname "xxx.exe"
 * @returns  返回[]为未运行
 */
const appStatus = (appname) => {
  return new Promise((resolve, reject) => {
    exec(
      `tasklist /FI "IMAGENAME eq ${appname}"`,
      { encoding: "buffer" },
      (error, stdout, stderr) => {
        if (error) {
          console.error(`执行命令出错: ${error}`);
          reject(error); // 如果有错误，reject Promise
          return;
        }
        // 将 stdout 从 GBK 编码转换为 UTF-8 编码
        const output = iconv.decode(stdout, "GBK");
        const lines = output.replace("\r").split(/[\n]/);
        const list2 = [];
        // 解析结果并输出 PID
        if (lines.length > 2) {
          for (let i = 3; i < lines.length; i++) {
            if (lines[i] !== "") {
              list2.push(lines[i].split(/ +/));
            }
          }
        }

        resolve(list2); // 如果成功，resolve Promise 并返回结果
      }
    );
  });
};


let childProcess = {};

function startProcess(query) {
  const fileName = path.basename(query);
  console.log(`获取程序名：${fileName}`)
  // 启动外部程序
  childProcess[fileName] = spawn(query);

  // // 捕获程序的输出
  // childProcess[fileName].stdout.on("data", (data) => {
  //   const data_ = iconv.decode(data, "GBK");
  //   console.log(`${query} 子进程 stdout: ${data_.toString()}`);
  // });

  // // 捕获程序的错误输出， 输出子进程中的终端打印
  // childProcess[fileName].stderr.on("data", (data) => {
  //   const data_ = iconv.decode(data, "GBK");
  //   console.log(`${query} 子进程 stderr: ${data_.toString()}`);
  // });

  // 捕获程序退出时的事件
  childProcess[fileName].on("exit", (code) => {
    console.log(`${query} 子进程退出，退出码: ${code}`);
  });

  // 捕获错误
  childProcess[fileName].on("error", (err) => {
    const err_ = iconv.decode(err, "GBK");
    console.error(`${query} 子进程 启动时发生错误 ${err_}`);
  });

  console.log(`${query} 程序已启动`);
}
/**
 * 杀死程序
 * @param {*} query // "subprocess子进程.exe"
 * @returns 
 */
let stopProcess = (query) => {
  let command = `taskkill /f /t /im ${query}`;
  return new Promise((resolve, reject) => {
    // 方法一：
    exec(command, { encoding: "buffer" }, function (error, stdout, stderr) {
      // 将 stdout 从 GBK 编码转换为 UTF-8 编
      const stdout_ = iconv.decode(stdout, "GBK");
      const stderr_ = iconv.decode(stderr, "GBK");
      // console.log("stdout_", stdout_);
      // console.log("stderr_", stderr_);
      if (!error) {
        console.log(`命令 <${command}> 进程终止成功`);
        resolve(true); // 返回 true
      } else {
        console.log(`命令 <${command}> 进程终止失败：${stderr_}`);
        reject(false); // 返回 false，表示失败
      }
    });
    // 方法二： childProcess[query]为开始进程时记录的事件,只用通过startProcess启动的程序方可终止
    // if (childProcess[query]) {
    //   // 发送 SIGINT 信号来停止进程
    //   childProcess[query].kill("SIGINT");
    //   console.log("程序已停止");
    // } else {
    //   console.log("没有正在运行的进程");
    // }
  });
};

module.exports = {
  executeCommand,
  appStatus,
  startProcess,
  stopProcess,
};
